package ffmpeg

import (
	"encoding/json"
	u "live_record_app/utils"
	"os/exec"
)

var log = u.LoadLogs("logs/", "ffmpeg.log")

type disposition struct {
	Default          int `json:"default"`
	Dub              int `json:"dub"`
	Original         int `json:"original"`
	Comment          int `json:"comment"`
	Lyrics           int `json:"lyrics"`
	Karaoke          int `json:"karaoke"`
	Forced           int `json:"forced"`
	Hearing_impaired int `json:"hearing_impaired"`
	Visual_impaired  int `json:"visual_impaired"`
	Clean_effects    int `json:"clean_effects"`
	Attached_pic     int `json:"attached_pic"`
	Timed_thumbnails int `json:"timed_thumbnails"`
}

type stream struct {
	Index            int         `json:"index"`           // 流索引号
	Codec_name       string      `json:"codec_name"`      // 编码器名
	Codec_long_name  string      `json:"codec_long_name"` // 编码器名全称
	Profile          string      `json:"profile"`
	Codec_type       string      `json:"codec_type"`       // 编码器类型
	Codec_time_base  string      `json:"codec_time_base"`  // 编码器每帧时长
	Codec_tag_string string      `json:"codec_tag_string"` // 编码器标签名
	Codec_tag        string      `json:"codec_tag"`        // 编码器标签
	Sample_fmt       string      `json:"sample_fmt"`       // 采样格式
	Sample_rate      string      `json:"sample_rate"`      // 采样率
	Channels         int         `json:"channels"`         // 音频数
	Channel_layout   string      `json:"channel_layout"`   // 通道布局，与channels是相对应，通过av_bprint_channel_layout获取，stereo表示立体声
	Bits_per_sample  int         `json:"bits_per_sample"`  // 采样码率
	R_frame_rate     string      `json:"r_frame_rate"`     // 真实基础帧率
	Avg_frame_rate   string      `json:"avg_frame_rate"`   // 平均帧率
	Time_base        string      `json:"time_base"`        // 每帧时长
	Start_pts        int         `json:"start_pts"`        // 流开始时间，基于time_base
	Start_time       string      `json:"start_time"`       // 首帧时间
	Duration_ts      int         `json:"duration_ts"`      // 流时长，基于time_base
	Duration         string      `json:"duration"`         // 文件总时间
	Bit_rate         string      `json:"bit_rate"`         // 码率
	Disposition      disposition `json:"disposition"`
}

type tag struct {
	Rawdata        string `json:"Rawdata"`
	DisplayWidth   string `json:"displayWidth"`
	DisplayHeight  string `json:"displayHeight"`
	Fps            string `json:"fps"`
	Profile        string `json:"profile"`
	Level          string `json:"level"`
	Encoder        string `json:"encoder"`
	Server         string `json:"server"`
	Server_version string `json:"server_version"`
}

type format struct {
	Filename         string `json:"filename"`   // 文件名
	Nb_streams       int    `json:"nb_streams"` // 流的数目
	Nb_programs      int    `json:"nb_programs"`
	Format_name      string `json:"format_name"`      // 格式名
	Format_long_name string `json:"format_long_name"` //格式名全称
	Start_time       string `json:"start_time"`       // 首帧时间
	Duration         string `json:"duration"`         // 时长
	Size             string `json:"size"`             // 文件大小
	Bit_rate         string `json:"bit_rate"`         // 码率
	Probe_score      int    `json:"probe_score"`
	Tags             tag    `json:"tags"` // 标签信息
}

type videoInfo struct {
	Streams []stream `json:"streams"`
	Format  format   `json:"format"`
}

func GetVideoInfo(path string) (videoInfo videoInfo, result bool) {
	cmd := exec.Command("ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", "-i", path)
	log.Info("获取视频详情", cmd)
	out, err := cmd.CombinedOutput()
	if err != nil {
		log.Error("获取视频详情", err)
		result = false
		return
	} else {
		json.Unmarshal(out, &videoInfo)
		result = true
		return
	}
}

func CutVideo(inPath string, outPath string, startTime string, duration string) (err bool) {
	cmd := exec.Command("ffmpeg", "-y", "-ss", startTime, "-t", duration, "-i", inPath, "-b:v", "2000k", "-maxrate", "2500k", "-r", "30", "-max_muxing_queue_size", "512", outPath)
	log.Info("裁切视频", cmd)
	_, res := cmd.CombinedOutput()
	if res != nil {
		log.Error("裁切视频", res)
		return
	}
	err = true
	return
}
